﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO;
using System.Threading;

namespace DTS
{
    public partial class Form1 : Form
    {
        // DANE
        volatile Controller c;
        Splash splashScreen;
        Dictionary<String, Notowania> listaNotowan;
        System.Windows.Forms.Timer timerNotowania;
        int timeRefreshNotowania = 5000;
        String actualHistorySymbol="";
        Wykres w;
        int sortNotowaniaIdx = -1;
        SortOrder sortNotowaniaOrder = SortOrder.None;
        int sortObserwowaneIdx = -1;
        SortOrder sortObserwowaneOrder = SortOrder.None;
        int selectedNotowaniaIdx = -1;
        int selectedObserwowaneIdx = -1;
        int selectedWalorIdx = -1;
        Double mPodatek = 0.19;
        // KONSTRUKTOR - ladowanie aplikacji
        public Form1()
        {
            timerNotowania = new System.Windows.Forms.Timer();
            timerNotowania.Tick += new EventHandler(timerNotowania_Tick);
            timerNotowania.Interval = timeRefreshNotowania;
            if (DateTime.Now.DayOfWeek != DayOfWeek.Saturday && DateTime.Now.DayOfWeek != DayOfWeek.Sunday)
                timerNotowania.Start();
            splashScreen = new Splash();
            InitializeComponent();
            splashScreen.Visible = true;
            splashScreen.Refresh();
            splashScreen.changeStatus("Sprawdzanie połączenia z internetem...");
            if (this.sprawdzeniePolaczenia())
                splashScreen.changeStatus("Połączenie dostępne!");
            else
            {
                splashScreen.changeStatus("Brak połączenia z internetem.Wyjście...");
                Thread.Sleep(1000);
                splashScreen.Visible = false;
                splashScreen = null;
                this.Close();
                System.Environment.Exit(0);
            }
            splashScreen.changeStatus("Pobieranie danych z BD...");
            c = new Controller();
            w = new Wykres(pictureBoxWykres, pictureBoxCeny, pictureBoxDaty, pictureBoxWolumen);
            splashScreen.changeStatus("Pobieranie aktualnych notowań...");
            listaNotowan = c.getNotowania();
            splashScreen.changeStatus("Ładowanie komponentów...");
            initComponents();
            wczytajUstawienia();
            WczytajDoControllera();
        }
        // funkcje pomocnicze
        private void initComponents()
        {
            notowania.DataSource = fillSourceNotowania(listaNotowan);
            spolki.DataSource = fillSourceSpolki(c.getAllSpolki());
            walory.DataSource = fillSourcePortfel(c.getWalory());
            transakcje.DataSource = fillSourceTransakcje(c.getTransaction());
            obserwowane.DataSource = fillSourceObserwowane(c.getObserwowane());
            spolki.Columns[0].Width = 70;
            spolki.Columns[1].Width = 380;
            spolki.Columns[2].Width = 170;
            spolki.Columns[3].Width = 154;
            spolki.Columns[4].Width = 130;
            spolki.Columns[5].Width = 75;

            walory.Columns[0].Width = 70;
            walory.Columns[1].Width = 200;
            walory.Columns[2].Width = 100;
            walory.Columns[3].Width = 154;
            walory.Columns[4].Width = 127;
            walory.Columns[5].Width = 127;
            walory.Columns[6].Width = 100;
            transakcje.Columns[0].Width = 150;
            transakcje.Columns[1].Width = 50;
            transakcje.Columns[2].Width = 172;
            transakcje.Columns[3].Width = 130;
            transakcje.Columns[4].Width = 100;
            transakcje.Columns[5].Width = 80;
            transakcje.Columns[6].Width = 100;
            //transakcje.Columns[6].Width = 75;
            //transakcje.Columns[7].Width = 75;


            notowania.Columns[1].Width = 279;
            obserwowane.Columns[1].Width = 279;
            monthCalendarOD.SelectionStart = new DateTime(2011, 04, 16);
            monthCalendarDO.SelectionStart = DateTime.Now;

            dateTimeHistoriaTransakcjiOD.Value = new DateTime(2011, 05, 01);
            dateTimeHistoriaTransakcjiDO.Value = DateTime.Now;

            updateGotowkaLabel();
        }
        private void updateGotowkaLabel()
        {
            labelGotowka.Text = "Gotówka: " + Pomocnik.makeZeros(c.getGotowka().ToString()) + " zł";
            labelGotowkaNotowania.Text = labelGotowka.Text;
            labelGotowkaObserwowane.Text = labelGotowka.Text;
        }
        private void doChangeHistoria()
        {
            if (!labelSpolka.Text.Equals(""))
            {
                historiaNotowan.DataSource = fillSourceHistoria(
                    (c.getHistoriaSpolki(actualHistorySymbol,
                                        monthCalendarOD.SelectionStart,
                                        monthCalendarDO.SelectionStart))
                    );
                //var daneWykres = c.getHistoriaSpolki(actualHistorySymbol, monthCalendarOD.SelectionStart, monthCalendarDO.SelectionStart);
                //w.rysujWykresLinia(daneWykres, monthCalendarOD.SelectionStart, monthCalendarDO.SelectionStart);
            }
            
        }
        private void updateNotowaniaFiltrowania()
        {
            String spolka = textBoxNotowaniaNazwa.Text;
            DataTable tabela = fillSourceNotowania(listaNotowan);
            notowania.DataSource = tabela;
            if (spolka.Equals("")) return;
            String expr = "Nazwa like" + "'*" + spolka + "*'";
            var RowsToInsert = tabela.Select(expr);
            DataTable table = new DataTable();
            table.Columns.Add("Symbol", typeof(String));
            table.Columns.Add("Nazwa", typeof(String));
            table.Columns.Add("Otwarcie", typeof(String));
            table.Columns.Add("Min", typeof(String));
            table.Columns.Add("Max", typeof(String));
            table.Columns.Add("Cena aktualna", typeof(String));
            table.Columns.Add("Zmiana", typeof(String));
            table.Columns.Add("Wolumen", typeof(String));
            foreach (var tmp in RowsToInsert)
                table.ImportRow(tmp);
            notowania.DataSource = table;
            var selected = walory.SelectedCells;
            List<SelectedCell> temp = new List<SelectedCell>();
            for (int i = 0; i < selected.Count; i++)
                temp.Add(new SelectedCell(selected[i].RowIndex, selected[i].ColumnIndex));
            walory.DataSource = fillSourcePortfel(c.getWalory());
            walory.ClearSelection();
            if (temp.Count != 0)
            {
                int idx = temp[0].row;
                bool toRowSelect = true;
                foreach (SelectedCell tmp in temp)
                {
                    if (idx != tmp.row) toRowSelect = false;
                    walory.Rows[tmp.row].Cells[tmp.column].Selected = true;
                }
                if (toRowSelect && temp.Count == 8) walory.Rows[idx].Selected = true;
            }
        }
        private void updateObserwowaneTimer()
        {
            var selected = obserwowane.SelectedCells;
            List<SelectedCell> temp = new List<SelectedCell>();
            for (int i = 0; i < selected.Count; i++)
                temp.Add(new SelectedCell(selected[i].RowIndex, selected[i].ColumnIndex));

            obserwowane.DataSource = fillSourceObserwowane(c.getObserwowane());
            obserwowane.ClearSelection();
            if (temp.Count != 0)
            {
                int idx = temp[0].row;
                bool toRowSelect = true;
                foreach (SelectedCell tmp in temp)
                {
                    if (idx != tmp.row) toRowSelect = false;
                    obserwowane.Rows[tmp.row].Cells[tmp.column].Selected = true;
                }
                if (toRowSelect && temp.Count == 8) obserwowane.Rows[idx].Selected = true;
            }
        }
        private void updatePortfelTransakcjaGotowka()
        {

            walory.DataSource = fillSourcePortfel(c.getWalory());
            transakcje.DataSource = fillSourceTransakcje(c.getTransaction());
            updateGotowkaLabel();
        }
        private void updateTransakcje()
        {
            String spolka = textBoxHistoriaTransakcjiSymbol.Text;
            if (spolka.Equals("") || c.getSpolka(spolka) == null && !spolka.Equals("$$$"))
            {
                transakcje.DataSource = fillSourceTransakcje(c.getTransaction(dateTimeHistoriaTransakcjiOD.Value, dateTimeHistoriaTransakcjiDO.Value));
                return;
            }
            transakcje.DataSource = fillSourceTransakcje(c.getTransaction(spolka, dateTimeHistoriaTransakcjiOD.Value, dateTimeHistoriaTransakcjiDO.Value));
        }
        private bool sprawdzeniePolaczenia()
        {
            try
            {
                var host = System.Net.Dns.GetHostEntry("www.stooq.pl");
                return true;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
                return false; // host not reachable.
            }
        }
        private void updateTimerNotowania()
        {
            var scroll = notowania.FirstDisplayedScrollingRowIndex;
            var selected = notowania.SelectedCells;
            List<SelectedCell> temp = new List<SelectedCell>();
            for (int i = 0; i < selected.Count; i++)
                temp.Add(new SelectedCell(selected[i].RowIndex, selected[i].ColumnIndex));
            updateNotowaniaFiltrowania();
            updateObserwowaneTimer();
            
            
            notowania.ClearSelection();
            if (sortNotowaniaIdx != -1)
            {
                if (sortNotowaniaOrder == SortOrder.Ascending)
                    notowania.Sort(notowania.Columns[sortNotowaniaIdx], ListSortDirection.Ascending);
                else
                    notowania.Sort(notowania.Columns[sortNotowaniaIdx], ListSortDirection.Descending);
            }

            if (sortObserwowaneIdx != -1)
            {
                if (sortObserwowaneOrder == SortOrder.Ascending)
                    obserwowane.Sort(obserwowane.Columns[sortObserwowaneIdx], ListSortDirection.Ascending);
                else
                    obserwowane.Sort(obserwowane.Columns[sortObserwowaneIdx], ListSortDirection.Descending);
            }

            if (temp.Count != 0)
            {
                int idx = temp[0].row;
                bool toRowSelect = true;
                foreach (SelectedCell tmp in temp)
                {
                    if (idx != tmp.row) toRowSelect = false;
                    notowania.Rows[tmp.row].Cells[tmp.column].Selected = true;
                }
                if (toRowSelect && temp.Count == 8) notowania.Rows[idx].Selected = true;
            }
            if (scroll >= 0 && scroll <= 10000)
                    notowania.FirstDisplayedScrollingRowIndex = scroll;

        }
        private void updateRysowanie()
        {
            if (actualHistorySymbol.Equals("")) return;
            DateTime data_do = DateTime.Today;
            monthCalendarDO.SelectionStart = data_do;
            DateTime data_od = DateTime.Today.AddMonths(-1);

            switch (comboBoxZakres.SelectedIndex)
            {
                case 0: // 1m
                    data_od = DateTime.Today.AddMonths(-1);
                    break;
                case 1: //3m
                    data_od = DateTime.Today.AddMonths(-3);
                    break;
                case 2: //6m
                    data_od = DateTime.Today.AddMonths(-6);
                    break;
                case 3: //1r
                    data_od = DateTime.Today.AddYears(-1);
                    break;
                case 4: //2l
                    data_od = DateTime.Today.AddYears(-2);
                    break;
                case 5: //3l
                    data_od = DateTime.Today.AddYears(-3);
                    break;
                case 6: //4l
                    data_od = DateTime.Today.AddYears(-4);
                    break;
                case 7: //5l
                    data_od = DateTime.Today.AddYears(-5);
                    break;
                case 8: //10l
                    data_od = DateTime.Today.AddYears(-10);
                    break;
                default:
                    break;
            }

            monthCalendarOD.SelectionStart = data_od;

            var daneWykres = c.getHistoriaSpolki(actualHistorySymbol, data_od, data_do);

            if (radioButtonLinia.Checked)
                w.rysujWykresLinia(daneWykres, data_od, data_do);
            else if (radioButtonSwieczka.Checked)
                w.rysujWykresSwieczka(daneWykres, data_od, data_do);
        }
        // funkcje wypelniajace tabele
        private DataTable fillSourceSpolki(IEnumerable<Spolka> listaSpolek)
        {
            DataTable table = new DataTable();
            table.Columns.Add("Symbol", typeof(String));
            table.Columns.Add("Pełna nazwa", typeof(String));
            table.Columns.Add("Sektor", typeof(String));
            table.Columns.Add("Kapitalizacja", typeof(Double));
            table.Columns.Add("Liczba akcji", typeof(long));
            table.Columns.Add("Freefloat", typeof(Double));
            foreach (var tmp in listaSpolek)
                table.Rows.Add(tmp.GetSymbol(), tmp.GetPelnaNazwa(), tmp.GetSektor(), Math.Round(tmp.GetKapitalizacja(),0), tmp.GetLiczbaAkcji(), tmp.GetFreeFloat());
            
            //var dataToFill = table.Select("Symbol like '*op*'");
           // foreach (DataRow tmp in dataToFill)
            //    table.ImportRow(tmp);
            return table;
        }
        private IEnumerable<Spolka> getSourceSpolki(String nazwa, String sektor, String kapitalizacjaMin, String kapitalizacjaMax)
        {
            IEnumerable<Spolka> toRet = c.getAllSpolki();
            if (!nazwa.Equals("")) toRet = toRet.Intersect(c.findSpolka(nazwa));
            if (!sektor.Equals("")) toRet = toRet.Intersect(c.getSpolkaSektor(sektor));
            if (!kapitalizacjaMin.Equals("")) toRet = toRet.Intersect(c.getSpolkaKapitalizacja(Double.Parse(kapitalizacjaMin), 999999999999999999));
            if (!kapitalizacjaMax.Equals("")) toRet = toRet.Intersect(c.getSpolkaKapitalizacja(0, Double.Parse(kapitalizacjaMax)));
            return toRet;
        }
        private DataTable fillSourceNotowania(Dictionary<String, Notowania> listaNotowan)
        {
            DataTable table = new DataTable();
            table.Columns.Add("Symbol", typeof(String));
            table.Columns.Add("Nazwa", typeof(String));
            table.Columns.Add("Otwarcie", typeof(Double));
            table.Columns.Add("Min", typeof(Double));
            table.Columns.Add("Max", typeof(Double));
            table.Columns.Add("Cena aktualna", typeof(Double));
            table.Columns.Add("Zmiana", typeof(Double));
            table.Columns.Add("Wolumen", typeof(int));
            foreach (var tmp in listaNotowan)
            {
                Spolka g = c.getSpolka(tmp.Key);
                String nazwa = "Jakies cos nie dzialajace";
                if (g != null)
                    nazwa = g.GetPelnaNazwa();
                table.Rows.Add(tmp.Key,
                               nazwa,
                               tmp.Value.GetOpen(),
                               tmp.Value.GetMin(),
                               tmp.Value.GetMax(),
                               tmp.Value.GetClose(),
                               tmp.Value.GetZmiana(),
                               tmp.Value.GetVolume());
            }
            return table;
        }
        private DataTable fillSourcePortfel(List<Walor> listaWalorow)
        {
            DataTable table = new DataTable();
            table.Columns.Add("Symbol", typeof(String));
            table.Columns.Add("Nazwa", typeof(String));
            table.Columns.Add("Pozycja", typeof(String));
            table.Columns.Add("Liczba sztuk", typeof(int));
            table.Columns.Add("Średnia cena zakupu", typeof(Double));
            table.Columns.Add("Aktualna cena", typeof(Double));
            table.Columns.Add("Zmiana", typeof(Double));
            table.Columns.Add("Owner", typeof(String));
            //try
            //{

                foreach (var tmp in listaWalorow)
                {
                    String pozycja;
                    Double zmiana = 0.00;
                    Double close = 0.00;
                    if (tmp.getIsShort())
                    {
                        pozycja = "Krótka";
                        if (listaNotowan.ContainsKey(tmp.getSymbol()))
                            zmiana = Math.Round((tmp.getAvgBuy() - listaNotowan[tmp.getSymbol()].GetClose()) * 100 / tmp.getAvgBuy(), 2);
                    }
                    else
                    {
                        pozycja = "Długa";
                        if (listaNotowan.ContainsKey(tmp.getSymbol()))
                            zmiana = Math.Round((tmp.getAvgBuy() - listaNotowan[tmp.getSymbol()].GetClose()) * -100 / tmp.getAvgBuy(), 2);
                    }
                    if (listaNotowan.ContainsKey(tmp.getSymbol()))
                        close = listaNotowan[tmp.getSymbol()].GetClose();
                    table.Rows.Add(tmp.getSymbol(),
                                   c.getSpolka(tmp.getSymbol()).GetPelnaNazwa(),
                                   pozycja,
                                   tmp.getLiczba(),
                                   Math.Round(tmp.getAvgBuy(), 2),
                                   close,
                                   zmiana,
                                   tmp.getOwner());
                }
            return table;
        }
        private DataTable fillSourceHistoria(HistoriaSpolki historia)
        {
            var lista = historia.getDane();
            lista.Sort((first, second) => first.GetData().CompareTo(second.GetData()));
            DataTable table = new DataTable();
            table.Columns.Add("Data", typeof(DateTime));
            table.Columns.Add("Otwarcie", typeof(Double));
            table.Columns.Add("Min", typeof(Double));
            table.Columns.Add("Max", typeof(Double));
            table.Columns.Add("Zamkniecie", typeof(Double));
            table.Columns.Add("Zmiana", typeof(Double));
            table.Columns.Add("Wolumen", typeof(long));
            string dataformatted;
            Double odniesienie = lista[0].GetOpen();
            Double zmiana = lista[0].GetClose()/lista[0].GetOpen() - 1;
            for(int i=0;i<lista.Count;i++)
            {
                if (i != 0)
                    zmiana = lista[i].GetClose() / lista[i - 1].GetClose() - 1;
                dataformatted = lista[i].GetData().Day.ToString() + "." + lista[i].GetData().Month.ToString() + "." + lista[i].GetData().Year.ToString();
                table.Rows.Add(lista[i].GetData(),
                               Math.Round(lista[i].GetOpen(), 2),
                               Math.Round(lista[i].GetMin(), 2),
                               Math.Round(lista[i].GetMax(), 2),
                               Math.Round(lista[i].GetClose(), 2),
                               Math.Round(100 * (zmiana),2),
                               lista[i].GetVolume());
            }
            return table;
        }
        private DataTable fillSourceTransakcje(List<Transakcja> listaNotowan)
        {
            Double suma = 0;
            DataTable table = new DataTable();
            table.Columns.Add("Data", typeof(DateTime));
            table.Columns.Add("Symbol", typeof(String));
            table.Columns.Add("Nazwa", typeof(String));
            table.Columns.Add("Rodzaj", typeof(String));
            table.Columns.Add("Liczba", typeof(String));
            table.Columns.Add("Cena", typeof(String));
            table.Columns.Add("Prowizja", typeof(String));
            table.Columns.Add("Zysk", typeof(Double));
            table.Columns.Add("Owner", typeof(String));
            foreach (var tmp in listaNotowan)
            {
                Spolka g = c.getSpolka(tmp.getSymbol());
                suma += tmp.getZysk();
                String nazwa = "Gotówka";
                if (g != null)
                    nazwa = g.GetPelnaNazwa();
                String dataformatted = Pomocnik.makeOneZeros(tmp.getData().Day.ToString()) + "." + 
                                       Pomocnik.makeOneZeros(tmp.getData().Month.ToString()) + "." + 
                                       Pomocnik.makeOneZeros(tmp.getData().Year.ToString()) +" "+
                                       Pomocnik.makeOneZeros(tmp.getData().Hour.ToString())+":"+
                                       Pomocnik.makeOneZeros(tmp.getData().Minute.ToString())+":"+
                                       Pomocnik.makeOneZeros(tmp.getData().Second.ToString());
                table.Rows.Add(tmp.getData(),
                               tmp.getSymbol(),
                               nazwa,
                               Pomocnik.transakcja(tmp.getRodzaj(true)),
                               tmp.getLiczba().ToString(),
                               Pomocnik.makeZeros(Math.Round(tmp.getCena(),2).ToString()),
                               Math.Round(tmp.getProwizja()*100,2).ToString() + "%",
                               Pomocnik.makeZeros(Math.Round(tmp.getZysk(),2).ToString()),
                               tmp.getOwner()
                               );
            }
            suma = Math.Round(suma, 2);
            Double podatek = Math.Round(suma*mPodatek,2);
            if (podatek < 0) podatek = 0;
            this.labelPodatek.Text = "Podatek: "+ Pomocnik.makeZeros(podatek.ToString()) + " zł";
            this.labelSumaZysk.Text = "Zysk: " + Pomocnik.makeZeros(suma.ToString()) + " zł";
            if (suma < 0) this.labelSumaZysk.ForeColor = Color.Red;
            if (suma > 0) this.labelSumaZysk.ForeColor = Color.Green;
            if (suma == 0) this.labelSumaZysk.ForeColor = Color.Black;
            return table; 
        }
        private DataTable fillSourceObserwowane(List<String> listaSpolek)
        {
            {
                DataTable table = new DataTable();
                table.Columns.Add("Symbol", typeof(String));
                table.Columns.Add("Nazwa", typeof(String));
                table.Columns.Add("Otwarcie", typeof(Double));
                table.Columns.Add("Min", typeof(Double));
                table.Columns.Add("Max", typeof(Double));
                table.Columns.Add("Cena aktualna", typeof(Double));
                table.Columns.Add("Zmiana", typeof(Double));
                table.Columns.Add("Wolumen", typeof(int));
                foreach (var tmp in listaSpolek)
                {
                    Spolka g = c.getSpolka(tmp);
                    Notowania s;
                    if (listaNotowan.ContainsKey(tmp))
                        s = listaNotowan[tmp];
                    else
                        s = new Notowania(0, 0, 0, 0, 0, 0);
                    String nazwa = "Jakies cos nie dzialajace";
                    Double zmiana;
                    if (s.GetClose() != 0.00)
                    zmiana = Math.Round(s.GetZmiana(), 2);
                    else
                        zmiana = 0.00;
                    if (g != null)
                        nazwa = g.GetPelnaNazwa();
                    table.Rows.Add(tmp,
                                   nazwa,
                                   s.GetOpen().ToString(),
                                   s.GetMin().ToString(),
                                   s.GetMax().ToString(),
                                   s.GetClose().ToString(),
                                   zmiana,
                                   s.GetVolume());
                }
                return table;
            }
        }
        // EVENTS
        private void timerNotowania_Tick(object sender, EventArgs e)
        {
            
            BackgroundWorker bw = new BackgroundWorker();
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            bw.RunWorkerAsync();
            
        }
        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            updateTimerNotowania();
        }
        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            Application.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
            listaNotowan = c.getNotowania();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            splashScreen.changeStatus("Aplikacja załadowana!");
            Thread.Sleep(500);
            splashScreen.Visible = false;
            splashScreen = null;
            this.Refresh();
        }
        private void filtrujSpolki(object sender, EventArgs e)
        {
            string nazwa = textSpolkiNazwa.Text;
            string sektor = textSpolkiSektor.Text;
            string min = textSpolkiKapitalizacjaMin.Text;
            string max = textSpolkiKapitalizacjaMax.Text;
            spolki.DataSource = (fillSourceSpolki(getSourceSpolki(nazwa,sektor,min,max)));
            spolki.ClearSelection();
        }
        private void zobaczDaneHistoryczneToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var selected = spolki.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            actualHistorySymbol = symbol;
            Spolka s = c.getSpolka(symbol);
            labelSpolka.Text = s.GetPelnaNazwa() + "   ("+symbol+")";
            tabControl1.SelectedIndex = 1;
            historiaNotowan.DataSource = fillSourceHistoria(c.getHistoriaSpolki(symbol,monthCalendarOD.SelectionStart,monthCalendarDO.SelectionStart));
            historiaNotowan.Columns[0].Width = 130;
            historiaNotowan.Columns[1].Width = 130;
            historiaNotowan.Columns[2].Width = 130;
            historiaNotowan.Columns[3].Width = 130;
            historiaNotowan.Columns[4].Width = 130;
            historiaNotowan.Columns[5].Width = 130;
            historiaNotowan.Columns[6].Width = 129;
            monthCalendarOD.SelectionStart = new DateTime(1991, 04, 16);
            monthCalendarDO.SelectionStart = DateTime.Now;
            comboBoxZakres.SelectedIndex = 0;
            updateRysowanie();
        }
        private void spolki_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right && e.RowIndex >= 0 && e.RowIndex<=spolki.RowCount)
            {
                spolki.ClearSelection();
                spolki.Rows[e.RowIndex].Selected = true;
                Rectangle r = spolki.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                contextMenuSpolki.Show((Control)sender, r.Left + e.X, r.Top + e.Y);
            }
        }
        private void spolki_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 3 || e.ColumnIndex == 4 || e.ColumnIndex == 5)
            {
                e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            }
            if (e.RowIndex % 2 == 0)
                e.CellStyle.BackColor = Color.WhiteSmoke;
            else
                e.CellStyle.BackColor = Color.LightSkyBlue;
        }
        private void historiaNotowan_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 5)
            {
                Double val = Double.Parse(e.Value.ToString());
                e.Value = Pomocnik.makeZeros(val.ToString()) + "%";
                if (val < 0) e.CellStyle.ForeColor = Color.Red;
                else
                    if (val > 0) e.CellStyle.ForeColor = Color.Green;
                    else
                        e.CellStyle.ForeColor = Color.Black;
            }
            if (e.ColumnIndex == 1 || e.ColumnIndex == 2 || e.ColumnIndex == 3 || e.ColumnIndex == 4)
            {
                e.Value = Pomocnik.makeZeros(e.Value.ToString());
            }
            if (e.RowIndex % 2 == 0)
                e.CellStyle.BackColor = Color.WhiteSmoke;
            else
                e.CellStyle.BackColor = Color.LightSkyBlue;
            e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
        }
        private void notowania_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 6)
            {
                Double val = Double.Parse(e.Value.ToString());
                e.Value = Pomocnik.makeZeros(val.ToString()) + "%";
                if (val < 0) e.CellStyle.ForeColor = Color.Red;
                else
                    if (val > 0) e.CellStyle.ForeColor = Color.Green;
                    else
                        e.CellStyle.ForeColor = Color.Black;
            }
            if (e.ColumnIndex == 2 || e.ColumnIndex == 3 || e.ColumnIndex == 4 || e.ColumnIndex == 5)
            {
                e.Value = Pomocnik.makeZeros(e.Value.ToString());
            }
            if (e.RowIndex % 2 == 0)
                e.CellStyle.BackColor = Color.WhiteSmoke;
            else
                e.CellStyle.BackColor = Color.LightSkyBlue;
            if (e.ColumnIndex != 1 && e.ColumnIndex != 0)
                e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
        }
        private void walory_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 6)
            {
                Double val = Double.Parse(e.Value.ToString());
                e.Value = Pomocnik.makeZeros(val.ToString()) + "%";
                if (val < 0) e.CellStyle.ForeColor = Color.Red;
                else
                    if (val > 0) e.CellStyle.ForeColor = Color.Green;
                    else
                        e.CellStyle.ForeColor = Color.Black;
            }
            if (e.ColumnIndex == 4 || e.ColumnIndex == 5)
            {
                e.Value = Pomocnik.makeZeros(e.Value.ToString());
            }
            if (e.RowIndex % 2 == 0)
                e.CellStyle.BackColor = Color.WhiteSmoke;
            else
                e.CellStyle.BackColor = Color.LightSkyBlue;
            if (e.ColumnIndex != 0 && e.ColumnIndex != 1)
                e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
        }
        private void monthCalendarDO_DateSelected(object sender, DateRangeEventArgs e)
        {
            this.doChangeHistoria();
        }
        private void monthCalendarOD_DateSelected(object sender, DateRangeEventArgs e)
        {
            this.doChangeHistoria();
        }
        private void monthCalendarOD_DateChanged(object sender, DateRangeEventArgs e)
        {
            this.doChangeHistoria();
        }
        private void monthCalendarDO_DateChanged(object sender, DateRangeEventArgs e)
        {
            this.doChangeHistoria();
        }
        private void buttonWyplata_Click(object sender, EventArgs e)
        {
            Double toSbb;
            try
            {
                toSbb = Double.Parse(textBoxGotowka.Text.Replace(',','.'));
            }
            catch /*(Exception ex)*/
            {
                MessageBox.Show("Niepoprawnie wpisana wartość");
                return;
            }
            if (!c.subGotowka(toSbb))
                MessageBox.Show("Niewystarczająca ilość gotówki");
            updateGotowkaLabel();
            updatePortfelTransakcjaGotowka();
        }
        private void buttonDodaj_Click_1(object sender, EventArgs e)
        {
            Double toAdd;
            try
            {
                toAdd = Double.Parse(textBoxGotowka.Text.Replace(',', '.'));
            }
            catch //(Exception ex)
            {
                MessageBox.Show("Niepoprawnie wpisana wartość");
                return;
            }
            c.addGotowka(toAdd);
            updateGotowkaLabel();
            updatePortfelTransakcjaGotowka();
        }
        private void buttonHSLastYear_Click(object sender, EventArgs e)
        {
            dateTimeHistoriaTransakcjiOD.Value = DateTime.Now.AddYears(-1);
            dateTimeHistoriaTransakcjiDO.Value = DateTime.Now;
        }
        private void buttonHSLastRR_Click(object sender, EventArgs e)
        {
            dateTimeHistoriaTransakcjiOD.Value = new DateTime(DateTime.Now.Year - 1, 1, 1);
            dateTimeHistoriaTransakcjiDO.Value = new DateTime(DateTime.Now.Year - 1, 12, 31);
        }
        private void buttonHSLast5Year_Click(object sender, EventArgs e)
        {
            dateTimeHistoriaTransakcjiOD.Value = DateTime.Now.AddYears(-5);
            dateTimeHistoriaTransakcjiDO.Value = DateTime.Now;
        }
        private void textBoxHistoriaTransakcjiSymbol_TextChanged(object sender, EventArgs e)
        {
            updateTransakcje();
        }
        private void textBoxNotowaniaNazwa_TextChanged(object sender, EventArgs e)
        {
            updateNotowaniaFiltrowania();
        }
        private void notowania_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right && e.RowIndex >= 0 && e.RowIndex <= notowania.RowCount)
            {
                selectedNotowaniaIdx = e.RowIndex;
                notowania.ClearSelection();
                notowania.Rows[e.RowIndex].Selected = true;
                Rectangle r = notowania.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                contextMenuNotowania.Show((Control)sender, r.Left + e.X, r.Top + e.Y);
            }
        }
        private void zobaczDaneHistoryczneToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            var selected = notowania.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            actualHistorySymbol = symbol;
            Spolka s = c.getSpolka(symbol);
            labelSpolka.Text = s.GetPelnaNazwa() + "   (" + symbol + ")";
            tabControl1.SelectedIndex = 1;
            historiaNotowan.DataSource = fillSourceHistoria(c.getHistoriaSpolki(symbol));
            historiaNotowan.Columns[0].Width = 130;
            historiaNotowan.Columns[1].Width = 130;
            historiaNotowan.Columns[2].Width = 130;
            historiaNotowan.Columns[3].Width = 130;
            historiaNotowan.Columns[4].Width = 130;
            historiaNotowan.Columns[5].Width = 130;
            historiaNotowan.Columns[6].Width = 129;
            monthCalendarOD.SelectionStart = new DateTime(1991, 04, 16);
            monthCalendarDO.SelectionStart = DateTime.Now;
            comboBoxZakres.SelectedIndex = 0;
            updateRysowanie();
        }
        private void kupnoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            String kupnoLiczbaStr = "";
            int kupnoLiczba = -1;
            var selected = notowania.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            if (Pomocnik.InputBox("Kupno", "Podaj ile chcesz kupić akcji: ", ref kupnoLiczbaStr) == DialogResult.OK)
            {
                try
                {
                    kupnoLiczba = int.Parse(kupnoLiczbaStr);
                    if (kupnoLiczba <= 0) throw new Exception();
                }
                catch //(Exception ex)
                {
                    MessageBox.Show("Niepoprawna wartość");
                    return;
                }
                if (c.transakcja(symbol, kupnoLiczba, false,DateTime.Now,"USER"))
                    MessageBox.Show("Zakup został dokonany");
                else
                {
                    MessageBox.Show("Niewystarczająca ilość gotówki na zakup");
                    return;
                }
                updatePortfelTransakcjaGotowka();
            }
        }
        private void krótkieKupnoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            String kupnoLiczbaStr = "";
            int kupnoLiczba = -1;
            var selected = notowania.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            if (Pomocnik.InputBox("Krótkie Kupno", "Podaj ile chcesz kupić akcji na krótko: ", ref kupnoLiczbaStr) == DialogResult.OK)
            {
                try
                {
                    kupnoLiczba = int.Parse(kupnoLiczbaStr);
                    if (kupnoLiczba <= 0) throw new Exception();
                }
                catch //(Exception ex)
                {
                    MessageBox.Show("Niepoprawna wartość");
                    return;
                }
                if (c.transakcja(symbol, kupnoLiczba, true, DateTime.Now, "USER"))
                    MessageBox.Show("Zakup został dokonany");
                else
                {
                    MessageBox.Show("Niewystarczająca ilość gotówki na zakup");
                    return;
                }
                updatePortfelTransakcjaGotowka();
            }
        }
        private void walory_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right && e.RowIndex >= 0 && e.RowIndex <= notowania.RowCount)
            {
                selectedWalorIdx = e.RowIndex;
                walory.ClearSelection();
                walory.Rows[e.RowIndex].Selected = true;
                Rectangle r = walory.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                contextMenuPortfel.Show((Control)sender, r.Left + e.X, r.Top + e.Y);
            }
        }
        private void zobaczDaneHistoryczneToolStripMenuItem2_Click(object sender, EventArgs e)
        {
            var selected = walory.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            actualHistorySymbol = symbol;
            Spolka s = c.getSpolka(symbol);
            labelSpolka.Text = s.GetPelnaNazwa() + "   (" + symbol + ")";
            tabControl1.SelectedIndex = 1;
            historiaNotowan.DataSource = fillSourceHistoria(c.getHistoriaSpolki(symbol));
            historiaNotowan.Columns[0].Width = 130;
            historiaNotowan.Columns[1].Width = 130;
            historiaNotowan.Columns[2].Width = 130;
            historiaNotowan.Columns[3].Width = 130;
            historiaNotowan.Columns[4].Width = 130;
            historiaNotowan.Columns[5].Width = 130;
            historiaNotowan.Columns[6].Width = 129;
            monthCalendarOD.SelectionStart = new DateTime(1991, 04, 16);
            monthCalendarDO.SelectionStart = DateTime.Now;
            updateRysowanie();
        }
        private void ZamknijPozycjeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var selected = walory.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            Walor w = c.getWalor(symbol);
            c.transakcja(symbol, w.getLiczba(), !w.getIsShort(), DateTime.Now, "USER");
            updatePortfelTransakcjaGotowka();
            MessageBox.Show("Pozycja została zamknięta");
        }
        private void zamknijCzęśćPozycjiToolStripMenuItem_Click(object sender, EventArgs e)
        {
            String kupnoLiczbaStr = "";
            int kupnoLiczba = -1;
            var selected = walory.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            Walor w = c.getWalor(symbol);
            if (Pomocnik.InputBox("Zamknięcie części pozycji", "Podaj ile chcesz sprzedać akcji: ", ref kupnoLiczbaStr) == DialogResult.OK)
            {
                try
                {
                    kupnoLiczba = int.Parse(kupnoLiczbaStr);
                    if (kupnoLiczba <= 0) throw new Exception();
                    if (kupnoLiczba >= w.getLiczba()) throw new Exception();
                }
                catch //(Exception ex)
                {
                    MessageBox.Show("Niepoprawna wartość");
                    return;
                }
                c.transakcja(symbol, kupnoLiczba, !w.getIsShort(), DateTime.Now, "USER");
                updatePortfelTransakcjaGotowka();
                MessageBox.Show("Sprzedaż została dokonana");
            }
        }
        private void odwróćPozycjeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            String kupnoLiczbaStr = "";
            int kupnoLiczba = -1;
            var selected = walory.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            Walor w = c.getWalor(symbol);
            if (Pomocnik.InputBox("Odwrócenie pozycji", "Podaj ile chcesz kupić akcji: ", ref kupnoLiczbaStr) == DialogResult.OK)
            {
                try
                {
                    kupnoLiczba = int.Parse(kupnoLiczbaStr);
                    if (kupnoLiczba <= 0) throw new Exception();
                }
                catch //(Exception ex)
                {
                    MessageBox.Show("Niepoprawna wartość");
                    return;
                }
                if (c.transakcja(symbol, kupnoLiczba + w.getLiczba(), !w.getIsShort(), DateTime.Now, "USER"))
                {
                    updatePortfelTransakcjaGotowka();
                    MessageBox.Show("Kupno zostało dokonana");
                }
                else
                {
                    MessageBox.Show("Niewystarczająca ilość gotówki");
                }
            }
        }
        private void dateTimeHistoriaTransakcjiOD_ValueChanged(object sender, EventArgs e)
        {
            updateTransakcje();
        }
        private void dateTimeHistoriaTransakcjiDO_ValueChanged(object sender, EventArgs e)
        {
            updateTransakcje();
        }
        private void transakcje_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex==4 || e.ColumnIndex == 5 || e.ColumnIndex == 6 || e.ColumnIndex == 7)
            {
                e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
            }
            if (e.RowIndex % 2 == 0)
                e.CellStyle.BackColor = Color.WhiteSmoke;
            else
                e.CellStyle.BackColor = Color.LightSkyBlue;
            if (e.ColumnIndex == 7)
            {
                Double val = Double.Parse(e.Value.ToString());
                if (val < 0) e.CellStyle.ForeColor = Color.Red;
                else
                    if (val > 0) e.CellStyle.ForeColor = Color.Green;
                    else
                        e.CellStyle.ForeColor = Color.Black;
            }
        }
        private void obserwujToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var selected = notowania.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            if (c.getObserwowane().Contains(symbol))
            {
                MessageBox.Show("Podana spółka jest już w obserwowanych!");
                return;
            }
            c.addObserwowana(symbol);
            obserwowane.DataSource = fillSourceObserwowane(c.getObserwowane());
        }
        private void obserwowane_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 6)
            {
                Double val = Double.Parse(e.Value.ToString());
                e.Value = Pomocnik.makeZeros(val.ToString()) + "%";
                if (val < 0) e.CellStyle.ForeColor = Color.Red;
                else
                    if (val > 0) e.CellStyle.ForeColor = Color.Green;
                    else
                        e.CellStyle.ForeColor = Color.Black;
            }
            if (e.ColumnIndex == 2 || e.ColumnIndex == 3 || e.ColumnIndex == 4 || e.ColumnIndex == 5)
                e.Value = Pomocnik.makeZeros(e.Value.ToString());
            if (e.RowIndex % 2 == 0)
                e.CellStyle.BackColor = Color.WhiteSmoke;
            else
                e.CellStyle.BackColor = Color.LightSkyBlue;
            if (e.ColumnIndex != 1 && e.ColumnIndex != 0)
                e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
        }
        private void obserwowane_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right && e.RowIndex >= 0 && e.RowIndex <= obserwowane.RowCount)
            {
                obserwowane.ClearSelection();
                selectedObserwowaneIdx = e.RowIndex;
                obserwowane.Rows[e.RowIndex].Selected = true;
                Rectangle r = obserwowane.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);
                contextMenuObserwowane.Show((Control)sender, r.Left + e.X, r.Top + e.Y);
            }
        }
        private void usuńZObserwowanychToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var selected = obserwowane.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            c.deleteObserowowana(symbol);
            obserwowane.DataSource = fillSourceObserwowane(c.getObserwowane());
        }
        private void kupnoToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            String kupnoLiczbaStr = "";
            int kupnoLiczba = -1;
            var selected = obserwowane.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            if (Pomocnik.InputBox("Kupno", "Podaj ile chcesz kupić akcji: ", ref kupnoLiczbaStr) == DialogResult.OK)
            {
                try
                {
                    kupnoLiczba = int.Parse(kupnoLiczbaStr);
                    if (kupnoLiczba <= 0) throw new Exception();
                }
                catch //(Exception ex)
                {
                    MessageBox.Show("Niepoprawna wartość");
                    return;
                }
                if (c.transakcja(symbol, kupnoLiczba, false, DateTime.Now, "USER"))
                    MessageBox.Show("Zakup został dokonany");
                else
                {
                    MessageBox.Show("Niewystarczająca ilość gotówki na zakup");
                    return;
                }
                updatePortfelTransakcjaGotowka();
            }
        }
        private void krótkieKupnoToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            String kupnoLiczbaStr = "";
            int kupnoLiczba = -1;
            var selected = obserwowane.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            if (Pomocnik.InputBox("Krótkie Kupno", "Podaj ile chcesz kupić akcji na krótko: ", ref kupnoLiczbaStr) == DialogResult.OK)
            {
                try
                {
                    kupnoLiczba = int.Parse(kupnoLiczbaStr);
                    if (kupnoLiczba <= 0) throw new Exception();
                }
                catch //(Exception ex)
                {
                    MessageBox.Show("Niepoprawna wartość");
                    return;
                }
                if (c.transakcja(symbol, kupnoLiczba, true, DateTime.Now, "USER"))
                    MessageBox.Show("Zakup został dokonany");
                else
                {
                    MessageBox.Show("Niewystarczająca ilość gotówki na zakup");
                    return;
                }
                updatePortfelTransakcjaGotowka();
            }
        }
        private void obserwujToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            var selected = spolki.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            if (c.getObserwowane().Contains(symbol))
            {
                MessageBox.Show("Podana spółka jest już w obserwowanych!");
                return;
            }
            c.addObserwowana(symbol);
            obserwowane.DataSource = fillSourceObserwowane(c.getObserwowane());
        }
        private void daneHistoryczneToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var selected = obserwowane.SelectedRows;
            String symbol = selected[0].Cells[0].Value.ToString();
            actualHistorySymbol = symbol;
            Spolka s = c.getSpolka(symbol);
            labelSpolka.Text = s.GetPelnaNazwa() + "   (" + symbol + ")";
            tabControl1.SelectedIndex = 1;
            historiaNotowan.DataSource = fillSourceHistoria(c.getHistoriaSpolki(symbol));
            historiaNotowan.Columns[0].Width = 130;
            historiaNotowan.Columns[1].Width = 130;
            historiaNotowan.Columns[2].Width = 130;
            historiaNotowan.Columns[3].Width = 130;
            historiaNotowan.Columns[4].Width = 130;
            historiaNotowan.Columns[5].Width = 130;
            historiaNotowan.Columns[6].Width = 129;
            monthCalendarOD.SelectionStart = new DateTime(1991, 04, 16);
            monthCalendarDO.SelectionStart = DateTime.Now;
            comboBoxZakres.SelectedIndex = 0;
            updateRysowanie();
        }
        private void comboBoxZakres_SelectedIndexChanged(object sender, EventArgs e)
        {
            updateRysowanie();

        }
        private void radioButtonSwieczka_CheckedChanged(object sender, EventArgs e)
        {
            updateRysowanie();                 
        }
        private void radioButtonLinia_CheckedChanged(object sender, EventArgs e)
        {
            updateRysowanie();
        }
        private void notowania_Sorted(object sender, EventArgs e)
        {
            sortNotowaniaIdx = notowania.SortedColumn.Index;
            sortNotowaniaOrder = notowania.SortOrder;
        }
        private void obserwowane_Sorted(object sender, EventArgs e)
        {
            sortObserwowaneIdx = obserwowane.SortedColumn.Index;
            sortObserwowaneOrder = obserwowane.SortOrder;
        }

        private void buttonNextDay_Click(object sender, EventArgs e)
        {
            DateTime actualDate = dateTimePickerSymulacja.Value;
            actualDate = actualDate.AddDays(1);
            dateTimePickerSymulacja.Value = actualDate;
            int licznik = 0;
            foreach (var tmp in c.getObserwowane())
            {
                if (checkBoxEMA15.Checked) c.computeChangeAlgorithm("EMA15",tmp, actualDate);
                if (checkBoxEMA20.Checked) c.computeChangeAlgorithm("EMA20", tmp, actualDate);
                if (checkBoxEMA30.Checked) c.computeChangeAlgorithm("EMA30", tmp, actualDate);
                if (checkBoxRSI15.Checked) c.computeChangeAlgorithm("RSI15", tmp, actualDate);
                if (checkBoxMINMAX20.Checked) c.computeChangeAlgorithm("MINMAX20", tmp, actualDate);
                if (checkBoxMINMAX30.Checked) c.computeChangeAlgorithm("MINMAX30", tmp, actualDate);
                if (checkBoxMINMAX50.Checked) c.computeChangeAlgorithm("MINMAX50", tmp, actualDate);
                if (checkBoxMACD.Checked) c.computeChangeAlgorithm("MACD12-26-9", tmp, actualDate);
                if (checkBoxSMA25.Checked) c.computeChangeAlgorithm("SMA25", tmp, actualDate);
                if (checkBoxSMA50.Checked) c.computeChangeAlgorithm("SMA50", tmp, actualDate);
                if (checkBoxSMA100.Checked) c.computeChangeAlgorithm("SMA100", tmp, actualDate);
                if (checkBoxSMA200.Checked) c.computeChangeAlgorithm("SMA200", tmp, actualDate);
                if (checkBoxMIX.Checked) c.computeChange(tmp, actualDate);
                licznik++;
                progressBar1.Value = (licznik*100) / c.getObserwowane().Count;
            }
            updatePortfelTransakcjaGotowka();    
            progressBar1.Value = 0;
        }

        private void buttonNext5Days_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 5; i++)
            {
                DateTime actualDate = dateTimePickerSymulacja.Value;
                actualDate = actualDate.AddDays(1);
                dateTimePickerSymulacja.Value = actualDate;
                int licznik = 0;
                foreach (var tmp in c.getObserwowane())
                {
                    if (checkBoxEMA15.Checked) c.computeChangeAlgorithm("EMA15", tmp, actualDate);
                    if (checkBoxEMA20.Checked) c.computeChangeAlgorithm("EMA20", tmp, actualDate);
                    if (checkBoxEMA30.Checked) c.computeChangeAlgorithm("EMA30", tmp, actualDate);
                    if (checkBoxRSI15.Checked) c.computeChangeAlgorithm("RSI15", tmp, actualDate);
                    if (checkBoxMINMAX20.Checked) c.computeChangeAlgorithm("MINMAX20", tmp, actualDate);
                    if (checkBoxMINMAX30.Checked) c.computeChangeAlgorithm("MINMAX30", tmp, actualDate);
                    if (checkBoxMINMAX50.Checked) c.computeChangeAlgorithm("MINMAX50", tmp, actualDate);
                    if (checkBoxMACD.Checked) c.computeChangeAlgorithm("MACD12-26-9", tmp, actualDate);
                    if (checkBoxSMA25.Checked) c.computeChangeAlgorithm("SMA25", tmp, actualDate);
                    if (checkBoxSMA50.Checked) c.computeChangeAlgorithm("SMA50", tmp, actualDate);
                    if (checkBoxSMA100.Checked) c.computeChangeAlgorithm("SMA100", tmp, actualDate);
                    if (checkBoxSMA200.Checked) c.computeChangeAlgorithm("SMA200", tmp, actualDate);
                    if (checkBoxMIX.Checked) c.computeChange(tmp, actualDate);
                    licznik++;
                    progressBar1.Value = ((i * c.getObserwowane().Count + licznik) * 100) / (c.getObserwowane().Count * 5);
                }
            }
            updatePortfelTransakcjaGotowka();
            progressBar1.Value = 0;
        }

        private void buttoNextMonth_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 30; i++)
            {
                DateTime actualDate = dateTimePickerSymulacja.Value;
                actualDate = actualDate.AddDays(1);
                dateTimePickerSymulacja.Value = actualDate;
                int licznik = 0;
                foreach (var tmp in c.getObserwowane())
                {
                    if (checkBoxEMA15.Checked) c.computeChangeAlgorithm("EMA15", tmp, actualDate);
                    if (checkBoxEMA20.Checked) c.computeChangeAlgorithm("EMA20", tmp, actualDate);
                    if (checkBoxEMA30.Checked) c.computeChangeAlgorithm("EMA30", tmp, actualDate);
                    if (checkBoxRSI15.Checked) c.computeChangeAlgorithm("RSI15", tmp, actualDate);
                    if (checkBoxMINMAX20.Checked) c.computeChangeAlgorithm("MINMAX20", tmp, actualDate);
                    if (checkBoxMINMAX30.Checked) c.computeChangeAlgorithm("MINMAX30", tmp, actualDate);
                    if (checkBoxMINMAX50.Checked) c.computeChangeAlgorithm("MINMAX50", tmp, actualDate);
                    if (checkBoxMACD.Checked) c.computeChangeAlgorithm("MACD12-26-9", tmp, actualDate);
                    if (checkBoxSMA25.Checked) c.computeChangeAlgorithm("SMA25", tmp, actualDate);
                    if (checkBoxSMA50.Checked) c.computeChangeAlgorithm("SMA50", tmp, actualDate);
                    if (checkBoxSMA100.Checked) c.computeChangeAlgorithm("SMA100", tmp, actualDate);
                    if (checkBoxSMA200.Checked) c.computeChangeAlgorithm("SMA200", tmp, actualDate);
                    if (checkBoxMIX.Checked) c.computeChange(tmp, actualDate);
                    licznik++;
                    progressBar1.Value = ((i * c.getObserwowane().Count + licznik) * 100) / (c.getObserwowane().Count * 30);
                }
            }
            updatePortfelTransakcjaGotowka();
            progressBar1.Value = 0;
        }

        private void buttonNextYear_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 365; i++)
            {
                DateTime actualDate = dateTimePickerSymulacja.Value;
                actualDate = actualDate.AddDays(1);
                dateTimePickerSymulacja.Value = actualDate;
                int licznik = 0;
                foreach (var tmp in c.getObserwowane())
                {
                    if (checkBoxEMA15.Checked) c.computeChangeAlgorithm("EMA15", tmp, actualDate);
                    if (checkBoxEMA20.Checked) c.computeChangeAlgorithm("EMA20", tmp, actualDate);
                    if (checkBoxEMA30.Checked) c.computeChangeAlgorithm("EMA30", tmp, actualDate);
                    if (checkBoxRSI15.Checked) c.computeChangeAlgorithm("RSI15", tmp, actualDate);
                    if (checkBoxMINMAX20.Checked) c.computeChangeAlgorithm("MINMAX20", tmp, actualDate);
                    if (checkBoxMINMAX30.Checked) c.computeChangeAlgorithm("MINMAX30", tmp, actualDate);
                    if (checkBoxMINMAX50.Checked) c.computeChangeAlgorithm("MINMAX50", tmp, actualDate);
                    if (checkBoxMACD.Checked) c.computeChangeAlgorithm("MACD12-26-9", tmp, actualDate);
                    if (checkBoxSMA25.Checked) c.computeChangeAlgorithm("SMA25", tmp, actualDate);
                    if (checkBoxSMA50.Checked) c.computeChangeAlgorithm("SMA50", tmp, actualDate);
                    if (checkBoxSMA100.Checked) c.computeChangeAlgorithm("SMA100", tmp, actualDate);
                    if (checkBoxSMA200.Checked) c.computeChangeAlgorithm("SMA200", tmp, actualDate);
                    if (checkBoxMIX.Checked) c.computeChange(tmp, actualDate);
                    progressBar1.Value = ((i * c.getObserwowane().Count+licznik) * 100) / (c.getObserwowane().Count * 365);
                    licznik++;
                }
            }
            updatePortfelTransakcjaGotowka();
            progressBar1.Value = 0;
        }

        private void buttonResetSymulation_Click(object sender, EventArgs e)
        {
            c.clearUD();
            c.addGotowka(10000);
            updatePortfelTransakcjaGotowka();
            dateTimePickerSymulacja.Value = new DateTime(2010, 5, 29, 18, 57, 0, 0);
            WczytajDoControllera();
        }

        private void buttonAnulujUstawienia_Click(object sender, EventArgs e)
        {
            wczytajUstawienia();
        }
        private void wczytajUstawienia()
        {
                StreamReader SR = File.OpenText("ustawienia.txt");
                String s = SR.ReadToEnd();
                String[] tab = s.Split();
                Dictionary<String, String> ustawienia = new Dictionary<string, string>();
                foreach (var tmp in tab)
                {
                    if (tmp != "")
                    {
                        var tablica = tmp.Split('=');
                        ustawienia.Add(tablica[0], tablica[1]);
                    }
                }
                var toSave = ustawienia;
                textBoxPodatek.Text = toSave["podatek"];
                textBoxProwizja.Text = toSave["prowizja"];
                textBoxProgSMA.Text = toSave["progSMA"];
                textBoxProgEMA.Text = toSave["progEMA"];
                textBoxProcentPortfela.Text = toSave["procentPortfela"];
                SR.Close();
        }

        private void buttonZapiszUstawienia_Click(object sender, EventArgs e)
        {
            zapiszUstawieniaPlik();
            WczytajDoControllera();
        }

        private void buttonDomyslne_Click(object sender, EventArgs e)
        {
            textBoxPodatek.Text = "19";
            textBoxProcentPortfela.Text = "20";
            textBoxProgEMA.Text = "1";
            textBoxProgSMA.Text = "3";
            textBoxProwizja.Text = "0,39";
        }

        private void WczytajDoControllera()
        {
            mPodatek = Double.Parse(textBoxPodatek.Text)/100;
            c.setProwizja(Double.Parse(textBoxProwizja.Text.Replace(",","."))/100);
            c.setProgEMA( Double.Parse(textBoxProgEMA.Text) / 100 + 1.00f);
            c.setProgSMA(Double.Parse(textBoxProgSMA.Text) / 100 + 1.00f);
            c.setProcentPortfela(Double.Parse(textBoxProcentPortfela.Text)/100);
        }
        private void zapiszUstawieniaPlik()
        {
            StreamWriter sw = File.CreateText("ustawienia.txt");
            sw.WriteLine("podatek=" + textBoxPodatek.Text);
            sw.WriteLine("prowizja=" + textBoxProwizja.Text);
            sw.WriteLine("progEMA=" + textBoxProgEMA.Text);
            sw.WriteLine("progSMA=" + textBoxProgSMA.Text);
            sw.WriteLine("procentPortfela=" + textBoxProcentPortfela.Text);
            sw.Close();
        }
    }
}
